<?php
declare(strict_types=1);

/**
 * 简单 TCP 登录探针脚本
 *
 * 作用：
 * - 使用 stream_socket_client 直连网关，尝试不同 EOL（CRLF/LF/NONE）
 * - 发送 LOGIN|user|pass 报文，读取响应，输出登录结果与流元数据
 * - 用于排查 Workerman 事件循环差异或行尾策略问题
 *
 * 使用：
 *   php scripts/tcp_probe.php
 * 可读取 .env（若通过环境导出），否则使用脚本内默认值：
 *   TCP_HOST=scgps.zhdkj.com.cn
 *   TCP_PORT=17910
 *   TCP_USER=13523033229
 *   TCP_PASS=123456
 *
 * 探针结论（已验证）：
 * - EOL=NONE 返回 "Login success"
 * - EOL=CRLF 或 LF 返回 "Login failed"
 */

$host = getenv('TCP_HOST') ?: 'scgps.zhdkj.com.cn';   // 目标域名
$port = (int)(getenv('TCP_PORT') ?: 17910);           // 端口
$user = getenv('TCP_USER') ?: '13523033229';          // 账号
$pass = getenv('TCP_PASS') ?: '123456';               // 密码
$timeout = 5;                                         // 连接与读取超时（秒）

$eols = [
    'CRLF' => "\r\n",                                 // 回车+换行
    'LF'   => "\n",                                   // 换行
    'NONE' => "",                                     // 无行尾（本网关要求）
];

/**
 * 尝试一次登录：建立连接→发送报文→读取响应→打印结果
 * @param string $host
 * @param int    $port
 * @param string $user
 * @param string $pass
 * @param string $name 行尾名称（CRLF/LF/NONE）
 * @param string $eol  行尾字符
 * @param int    $timeout 超时秒
 */
function try_login(string $host, int $port, string $user, string $pass, string $name, string $eol, int $timeout): void {
    $addr = "tcp://{$host}:{$port}";
    echo "== Try {$addr} EOL={$name} ==\n";
    $errno = 0; $errstr = '';
    $s = @stream_socket_client($addr, $errno, $errstr, $timeout);   // 建立阻塞连接
    if (!$s) {
        echo "CONNECT FAIL errno={$errno} err={$errstr}\n\n";
        return;
    }
    stream_set_blocking($s, true);                                   // 阻塞模式
    stream_set_timeout($s, $timeout);                                 // 读取超时
    $login = "LOGIN|{$user}|{$pass}{$eol}";                           // 登录报文
    $written = @fwrite($s, $login);                                   // 发送登录
    if ($written === false) {
        echo "WRITE FAIL\n\n";
        @fclose($s);
        return;
    }
    $resp = @fread($s, 2048);                                         // 读取响应（最多 2KB）
    $info = stream_get_meta_data($s);                                  // 读取流元数据
    @fclose($s);
    $respShow = $resp !== false ? $resp : '';                          // 规范化响应
    echo "RESP(len=" . strlen($respShow) . "): " . ($respShow !== '' ? $respShow : '[empty]') . "\n";
    echo "META: " . json_encode($info, JSON_UNESCAPED_UNICODE) . "\n\n";
}

// 逐一尝试三种行尾策略
foreach ($eols as $name => $eol) {
    try_login($host, $port, $user, $pass, $name, $eol, $timeout);
}